"""
Возвращает ссылку на класс USER. Атрибуты класса соответствуют названиям в таблице user.
"""

import os
import sys
import configparser

from PyQt5.QtWidgets import *
from PyQt5.QtSql import *
from PyQt5.QtGui import *

from library import field_column

def get_user(ini_file):

    """ ПОЛУЧАЕИ ССЫЛКУ НА КЛАСС USER.
    -- Создаём диалог авторизации. Возвращаем ссылку на класс User."""
    
    login = DialogLogin(ini_file)
    result = login.exec_()
    if result:
        return(login.user)


class DialogLogin(QDialog):

    def __init__(self, ini_file):
        super().__init__()

        self.ini_file = ini_file
        
        self.create_ui()
        self.init_ui()

    def create_ui(self):

        """ СОЗДАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА """

        # ПОЛЯ
        self.login = QComboBox()
        self.password = QLineEdit("")
        self.password.setEchoMode(QLineEdit.Password) # звездочки

        # КНОПКИ
        btn = QPushButton('АВТОРИЗАЦИЯ')
        btn.clicked.connect(self.authorization)
        
        # СБОРКА
        form = QFormLayout()
        form.addRow("Пользователь", self.login)
        form.addRow("Пароль", self.password)
        form.addRow(btn)

        self.setLayout(form)

        # АТРИБУТЫ ОКНА
        self.setWindowTitle('ВХОД')
        self.setWindowIcon(QIcon("pict\\order.ico"))
        self.setMinimumWidth(200)
        self.show()

        
    def init_ui(self):

        """ ЗАПОЛНЕНИЕ ПОЛЕЙ ФОРМЫ.
        --- Модель для поля <Пользователь>. Код пользователя вставляем в таблицы. 
            Фамилия для отображения. Пароль для авторизации. Привязваем  поле к 
            фамилии.
        --- Предудущий логин хранится в ini файле (APPDATA). Если секции USER 
            нет, то создаём.
        --- Подставляем логин из секции USER файла ini в поле со спискои."""
        
        self.model = QSqlQueryModel()
        self.model.setQuery(
            "SELECT rec_id, surname, passwd "
            "FROM users WHERE access = 1 ORDER BY surname;")
        self.login.setModel(self.model)
        self.col = field_column(self.model)
        self.login.setModelColumn(self.col['surname'])

        self.ini_file = "{}/{}".format(os.getenv('APPDATA'), self.ini_file)
        self.config = configparser.ConfigParser()
        self.config.read(self.ini_file)
        if not ('USER' in self.config):
            self.config['USER'] = {'login': ""}

        login = self.config['USER'].get('login','')
        if login:
            self.login.setCurrentIndex(self.login.findText(login))

            
    def authorization(self):

        """ НАЖАТИЕ КНОПКИ 'АВТОРИЗАЦИЯ'.
        -- По выбранному индексу поля находим в модели пароль. Если пароль не 
           равен введённому, то выводим сообщение. Выход.
        -- Создаем класс User. Создаем атрибуты соответствующие именам полей
           таблицы user. Сохраняем в атрибутах значения полей.
        -- Сохраняем логин в ini файле."""
        
        index = self.login.currentIndex()
        passwd = self.model.record(index).value('passwd')
        if self.password.text() != passwd:
            report = QMessageBox()
            report.setIcon(QMessageBox.Warning) # иконка
            report.setWindowTitle("НЕПРАВИЛЬНЫЙ ПАРОЛЬ.")
            report.setText("Введите правильный пароль или обратитесь к системному администратору.")
            # report.setWindowIcon(ICON_APP)
            report.exec_()
            return

        class User(): pass
        self.user = User()
        for name in self.col:
            setattr(self.user, name, self.model.record(index).value(name))

        self.config['USER']['login'] = self.login.currentText()
        with open(self.ini_file, 'w') as file_ini:
            self.config.write(file_ini)
        self.accept()

    def closeEvent(self,e):
    
        """ НАЖАТА СИСТЕМНАЯ КНОПКА <ЗАКРЫТЬ ФОРМУ>  ."""
        
        self.reject()


if __name__ == '__main__':

    from connmysql import get_db_mysql
    
    app = QApplication(sys.argv)
    db = get_db_mysql("test.ini")
    if not db:
        QMessageBox.critical(None, "НЕТ СОЕДИНЕНИЯ С БД", 
            "Запустите модуль connmysql.py для настройки соединения с БД.")
        quit()

    user = get_user("test.ini")
    if user:
        QMessageBox.information(None, 'self-test', "Пройдено удачно.")

